using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.Alf.Site.Entidades;

namespace MakeIT.Alf.Site.Negocios
{
	public partial class AlfDAO : DAO
	{

		public static PessoaVO getPessoa(int? idPessoa, string nome)
		{
			PessoaVO pessoaVO = null;
			List<PessoaVO> listPessoaVOs = getPessoas(idPessoa, nome, null, null, null, null, null);
			if (listPessoaVOs != null && listPessoaVOs.Count > 0)
			{
				pessoaVO = listPessoaVOs[0];
			}
			return pessoaVO;
		}

		public static PessoaVO getPessoa(int? idPessoa)
		{
			return getPessoa(idPessoa, null);
		}

		public static List<PessoaVO> getPessoas()
		{
			return getPessoas(null, null, null, null, null, null, null);
		}

		public static List<PessoaVO> getPessoas(int? idPessoa)
		{
			return getPessoas(idPessoa, null, null, null, null, null, null);
		}

		public static List<PessoaVO> getPessoas(int? idPessoa, string nome)
		{
			return getPessoas(idPessoa, nome, null, null, null, null, null);
		}

		public static List<PessoaVO> getPessoas(int? idPessoa, string nome, int? idLogradouro, string cPF, string cNPJ, string contato, string responsavel)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT pes.idPessoa as pes_idPessoa, pes.cPF as pes_cPF, pes.cNPJ as pes_cNPJ, pes.iE as pes_iE, pes.iM as pes_iM, pes.nome as pes_nome, pes.idLogradouro as pes_idLogradouro, pes.endNum as pes_endNum, pes.endCom as pes_endCom, pes.email as pes_email, pes.fone1 as pes_fone1, pes.fone2 as pes_fone2, pes.fone3 as pes_fone3, pes.contato as pes_contato, pes.responsavel as pes_responsavel, pes.Cadastro as pes_Cadastro, pes.CadastradoPor as pes_CadastradoPor, pes.Edicao as pes_Edicao, pes.EditadoPor as pes_EditadoPor  ");
			query.AppendLine("FROM pessoa as pes LEFT OUTER JOIN logradouro as log on pes.idLogradouro=log.idLogradouro  ");
			if (idPessoa != null)
			{
				query.AppendLine(where + "pes.idPessoa=@idPessoa ");
				where = "AND ";
			}
			if (cPF != null)
			{
				query.AppendLine(where + "pes.cPF=@cPF ");
				where = "AND ";
			}
			if (cNPJ != null)
			{
				query.AppendLine(where + "pes.cNPJ=@cNPJ ");
				where = "AND ";
			}
			if (nome != null)
			{
				query.AppendLine(where + "pes.nome LIKE @nome ");
				where = "AND ";
			}
			if (idLogradouro != null)
			{
				query.AppendLine(where + "pes.idLogradouro=@idLogradouro ");
				where = "AND ";
			}
			if (contato != null)
			{
				query.AppendLine(where + "pes.contato=@contato ");
				where = "AND ";
			}
			if (responsavel != null)
			{
				query.AppendLine(where + "pes.responsavel=@responsavel ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY pes.nome ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (idPessoa!= null) cmd.Parameters.Add(getParameter(cmd, "@idPessoa", idPessoa));
			if (cPF!= null) cmd.Parameters.Add(getParameter(cmd, "@cPF", cPF));
			if (cNPJ!= null) cmd.Parameters.Add(getParameter(cmd, "@cNPJ", cNPJ));
			if (nome!= null) cmd.Parameters.Add(getParameter(cmd, "@nome", "%"+nome+"%"));
			if (idLogradouro!= null) cmd.Parameters.Add(getParameter(cmd, "@idLogradouro", idLogradouro));
			if (contato!= null) cmd.Parameters.Add(getParameter(cmd, "@contato", contato));
			if (responsavel!= null) cmd.Parameters.Add(getParameter(cmd, "@responsavel", responsavel));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<PessoaVO> listPessoa = new List<PessoaVO>();

				while (reader.Read())
				{
					PessoaVO pessoaVO = PessoaVO.CreateVO();
					pessoaVO.idPessoa = reader.GetInt32(reader.GetOrdinal("pes_idPessoa"));
					if (!reader.IsDBNull(reader.GetOrdinal("pes_cPF")))
						pessoaVO.cPF = reader.GetString(reader.GetOrdinal("pes_cPF"));
					if (!reader.IsDBNull(reader.GetOrdinal("pes_cNPJ")))
						pessoaVO.cNPJ = reader.GetString(reader.GetOrdinal("pes_cNPJ"));
					if (!reader.IsDBNull(reader.GetOrdinal("pes_iE")))
						pessoaVO.iE = reader.GetString(reader.GetOrdinal("pes_iE"));
					if (!reader.IsDBNull(reader.GetOrdinal("pes_iM")))
						pessoaVO.iM = reader.GetString(reader.GetOrdinal("pes_iM"));
					pessoaVO.nome = reader.GetString(reader.GetOrdinal("pes_nome"));
					pessoaVO.idLogradouro = reader.GetInt32(reader.GetOrdinal("pes_idLogradouro"));
					pessoaVO.endNum = reader.GetString(reader.GetOrdinal("pes_endNum"));
					if (!reader.IsDBNull(reader.GetOrdinal("pes_endCom")))
						pessoaVO.endCom = reader.GetString(reader.GetOrdinal("pes_endCom"));
					if (!reader.IsDBNull(reader.GetOrdinal("pes_email")))
						pessoaVO.email = reader.GetString(reader.GetOrdinal("pes_email"));
					if (!reader.IsDBNull(reader.GetOrdinal("pes_fone1")))
						pessoaVO.fone1 = reader.GetString(reader.GetOrdinal("pes_fone1"));
					if (!reader.IsDBNull(reader.GetOrdinal("pes_fone2")))
						pessoaVO.fone2 = reader.GetString(reader.GetOrdinal("pes_fone2"));
					if (!reader.IsDBNull(reader.GetOrdinal("pes_fone3")))
						pessoaVO.fone3 = reader.GetString(reader.GetOrdinal("pes_fone3"));
					if (!reader.IsDBNull(reader.GetOrdinal("pes_contato")))
						pessoaVO.contato = reader.GetString(reader.GetOrdinal("pes_contato"));
					if (!reader.IsDBNull(reader.GetOrdinal("pes_responsavel")))
						pessoaVO.responsavel = reader.GetString(reader.GetOrdinal("pes_responsavel"));
					pessoaVO.cadastro = reader.GetDateTime(reader.GetOrdinal("pes_Cadastro"));
					pessoaVO.cadastradoPor = reader.GetString(reader.GetOrdinal("pes_CadastradoPor"));
					pessoaVO.edicao = reader.GetDateTime(reader.GetOrdinal("pes_Edicao"));
					pessoaVO.editadoPor = reader.GetString(reader.GetOrdinal("pes_EditadoPor"));


					listPessoa.Add(pessoaVO);
				}
				reader.Close();
				return listPessoa;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }
		}

		public static void setPessoa(PessoaVO pessoaVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE pessoa ");
			query.AppendLine("SET cPF=@cPF, cNPJ=@cNPJ, iE=@iE, iM=@iM, nome=@nome, idLogradouro=@idLogradouro, endNum=@endNum, endCom=@endCom, email=@email, fone1=@fone1, fone2=@fone2, fone3=@fone3, contato=@contato, responsavel=@responsavel,  Cadastro=@Cadastro, CadastradoPor=@CadastradoPor, Edicao=@Edicao, EditadoPor=@EditadoPor ");
			query.AppendLine("WHERE idPessoa=@idPessoa ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPessoa", pessoaVO.idPessoa));
			if (pessoaVO.cPF == null)
				cmd.Parameters.Add(getParameter(cmd, "@cPF", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@cPF", pessoaVO.cPF));
			if (pessoaVO.cNPJ == null)
				cmd.Parameters.Add(getParameter(cmd, "@cNPJ", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@cNPJ", pessoaVO.cNPJ));
			if (pessoaVO.iE == null)
				cmd.Parameters.Add(getParameter(cmd, "@iE", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@iE", pessoaVO.iE));
			if (pessoaVO.iM == null)
				cmd.Parameters.Add(getParameter(cmd, "@iM", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@iM", pessoaVO.iM));
			cmd.Parameters.Add(getParameter(cmd, "@nome", pessoaVO.nome));
			cmd.Parameters.Add(getParameter(cmd, "@idLogradouro", pessoaVO.idLogradouro));
			cmd.Parameters.Add(getParameter(cmd, "@endNum", pessoaVO.endNum));
			if (pessoaVO.endCom == null)
				cmd.Parameters.Add(getParameter(cmd, "@endCom", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@endCom", pessoaVO.endCom));
			if (pessoaVO.email == null)
				cmd.Parameters.Add(getParameter(cmd, "@email", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@email", pessoaVO.email));
			if (pessoaVO.fone1 == null)
				cmd.Parameters.Add(getParameter(cmd, "@fone1", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@fone1", pessoaVO.fone1));
			if (pessoaVO.fone2 == null)
				cmd.Parameters.Add(getParameter(cmd, "@fone2", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@fone2", pessoaVO.fone2));
			if (pessoaVO.fone3 == null)
				cmd.Parameters.Add(getParameter(cmd, "@fone3", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@fone3", pessoaVO.fone3));
			if (pessoaVO.contato == null)
				cmd.Parameters.Add(getParameter(cmd, "@contato", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@contato", pessoaVO.contato));
			if (pessoaVO.responsavel == null)
				cmd.Parameters.Add(getParameter(cmd, "@responsavel", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@responsavel", pessoaVO.responsavel));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", pessoaVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", pessoaVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", pessoaVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", pessoaVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }

		}

		public static long newPessoa(PessoaVO pessoaVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO pessoa ");
			query.AppendLine("  ( cPF, cNPJ, iE, iM, nome, idLogradouro, endNum, endCom, email, fone1, fone2, fone3, contato, responsavel, Cadastro, CadastradoPor, Edicao, EditadoPor ) ");
			query.AppendLine("VALUES ( @cPF, @cNPJ, @iE, @iM, @nome, @idLogradouro, @endNum, @endCom, @email, @fone1, @fone2, @fone3, @contato, @responsavel, @Cadastro, @CadastradoPor, @Edicao, @EditadoPor ) ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (pessoaVO.cPF == null)
				cmd.Parameters.Add(getParameter(cmd, "@cPF", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@cPF", pessoaVO.cPF));
			if (pessoaVO.cNPJ == null)
				cmd.Parameters.Add(getParameter(cmd, "@cNPJ", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@cNPJ", pessoaVO.cNPJ));
			if (pessoaVO.iE == null)
				cmd.Parameters.Add(getParameter(cmd, "@iE", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@iE", pessoaVO.iE));
			if (pessoaVO.iM == null)
				cmd.Parameters.Add(getParameter(cmd, "@iM", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@iM", pessoaVO.iM));
			cmd.Parameters.Add(getParameter(cmd, "@nome", pessoaVO.nome));
			cmd.Parameters.Add(getParameter(cmd, "@idLogradouro", pessoaVO.idLogradouro));
			cmd.Parameters.Add(getParameter(cmd, "@endNum", pessoaVO.endNum));
			if (pessoaVO.endCom == null)
				cmd.Parameters.Add(getParameter(cmd, "@endCom", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@endCom", pessoaVO.endCom));
			if (pessoaVO.email == null)
				cmd.Parameters.Add(getParameter(cmd, "@email", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@email", pessoaVO.email));
			if (pessoaVO.fone1 == null)
				cmd.Parameters.Add(getParameter(cmd, "@fone1", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@fone1", pessoaVO.fone1));
			if (pessoaVO.fone2 == null)
				cmd.Parameters.Add(getParameter(cmd, "@fone2", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@fone2", pessoaVO.fone2));
			if (pessoaVO.fone3 == null)
				cmd.Parameters.Add(getParameter(cmd, "@fone3", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@fone3", pessoaVO.fone3));
			if (pessoaVO.contato == null)
				cmd.Parameters.Add(getParameter(cmd, "@contato", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@contato", pessoaVO.contato));
			if (pessoaVO.responsavel == null)
				cmd.Parameters.Add(getParameter(cmd, "@responsavel", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@responsavel", pessoaVO.responsavel));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", pessoaVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", pessoaVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", pessoaVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", pessoaVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('pessoa') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }

		}

		public static void delPessoa(PessoaVO pessoaVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM pessoa ");
			query.AppendLine("WHERE idPessoa=@idPessoa ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPessoa", pessoaVO.idPessoa));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }

		}
		public static int getCountPessoaxIdLogradouro(int? idLogradouro)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idLogradouro) as ocorrencias FROM pessoa WHERE IdLogradouro=@IdLogradouro ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdLogradouro", idLogradouro));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }
		}
	}
}
